

#include <stdbool.h>
#include <stdint.h>

#include <platform.h>
#include "drivers/io.h"

#ifdef USE_SOFTSPI

#include "build/build_config.h"


#include "drivers/io.h"
#include "drivers/io_impl.h"
#include "drivers/bus_spi.h"
#include "bus_spi_soft.h"

IO_t sck;
//static uint16_t sckPin;
//GPIO_TypeDef* sckGpio;
//#define SCK_H sckGpio->BSRR = sckPin
//#define SCK_L sckGpio->BRR = sckPin
#define SCK_H IOWrite(sck, 1)
#define SCK_L IOWrite(sck, 0)

IO_t mosi;
// static uint16_t mosiPin;
// GPIO_TypeDef* mosiGpio;
// #define MOSI_H mosiGpio->BSRR = mosiPin
// #define MOSI_L mosiGpio->BRR = mosiPin
#define MOSI_H IOWrite(mosi, 1)
#define MOSI_L IOWrite(mosi, 0)

IO_t miso;
// static uint16_t misoPin;
// GPIO_TypeDef* misoGpio;
// #define MISO (misoGpio->IDR & misoPin)
#define MISO IORead(miso)

void softSpiInit(void)
{

    // IO_t leds = IOGetByTag(IO_TAG(PC13));
    // IOConfigGPIO(leds, IOCFG_OUT_PP);
    // while(1){
    //     IOWrite(leds, 1);
    //     delay(200);
    //     IOWrite(leds, 0);
    //     delay(200);
    // }

    sck = IOGetByTag(IO_TAG(RX_SCK_PIN));
    //sckPin = IO_Pin(sck);
    //sckGpio = IO_GPIO(sck);
    //IOConfigGPIO(sck, IO_CONFIG(GPIO_Mode_Out_PP,      GPIO_Speed_50MHz));
    IOConfigGPIO(sck, IOCFG_OUT_PP);

    mosi = IOGetByTag(IO_TAG(RX_MOSI_PIN));
    //mosiPin = IO_Pin(mosi);
    //mosiGpio = IO_GPIO(mosi);
    //IOConfigGPIO(mosi, IO_CONFIG(GPIO_Mode_Out_PP,      GPIO_Speed_50MHz));
    IOConfigGPIO(mosi, IOCFG_OUT_PP);

    miso = IOGetByTag(IO_TAG(RX_MISO_PIN));
    //misoPin = IO_Pin(miso);
    //misoGpio = IO_GPIO(miso);
    //IOConfigGPIO(miso, IO_CONFIG(GPIO_Mode_IN_FLOATING, GPIO_Speed_50MHz));
    IOConfigGPIO(miso, IOCFG_IN_FLOATING);

}

uint8_t softSpiTransferByte(uint8_t byte)
{
    for (int ii = 0; ii < 8; ++ii) {
        if (byte & 0x80) {
            MOSI_H;//IOHi(IOGetByTag(dev->mosiTag));
        } else {
            MOSI_L;//IOLo(IOGetByTag(dev->mosiTag));
        }
        SCK_H;//IOHi(IOGetByTag(dev->sckTag));
        byte <<= 1;
        if (MISO) {//IORead(IOGetByTag(dev->misoTag)) == 1
            byte |= 1;
        }
        SCK_L;//IOLo(IOGetByTag(dev->sckTag));
    }
    return byte;
}
#endif
